#coding=utf8
from worlds.world import World
from worldexc.worldexception import (WorldException, NoObjects, )
from worldexc.objectexception import (ObjectException,
                                      ObjectDie, NewObject, )
from actors import baseobject

class SimpleWorld(World):
    '''Простенький мир
    '''
    def __init__(self, *args, **kargs):
        self.dead_convert_to = kargs.get('dead_convert_to', None)
        World.__init__(self, *args, **kargs)
    
    def iterate(self, return_xy=False):
        
        xys = {}
        
        # если нету объектов, выбрасываем исключение
        if not self.objects:
            raise NoObjects()
        
        # перебираем все объекты
        for obj in self.objects:
            try:
                obj.act()
                if return_xy:
                    xys.setdefault(obj.__class__, [])
                    xys[obj.__class__].append(obj.get_coords())
                    
            except ObjectDie as e:
                # если объект умер - добавляем его в список трупов
                self.deads.append(e.object)
            except NewObject as e:
                self.children.append(dict(child=e.child, parent=e.parent))
            except ObjectException as e:
                print 'ObjExc: {0}'.format(e.__class__.__name__)
        
        # перебираем мертвых и избавляемся от них
        while self.deads:
            obj = self.deads.pop()
            if not self.dead_convert_to is None:
                obj = obj.convert_to(self.dead_convert_to)
            else:
                self.remove_object(obj)
        del obj
        self.deads = []
        
        #добавляем детей
        while self.children:
            child, parent = self.children.pop()
            self.init_object(child, parent)
        self.children = []
        
        if return_xy:
            return xys

    def iterate_while(self, iter_count=1, return_xy=False):
        xys = []
        for i in xrange(iter_count):
            try:
                if return_xy:
                    xys.append(self.iterate(return_xy=return_xy))
                else:
                    self.iterate()
            except NoObjects:
                break
        if return_xy:
            return xys
        